package com.prototype.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;
import org.springframework.stereotype.Repository;

@Repository
public interface BaseDAO<T extends Serializable> {
	/**
	 * 得到保存的实例对象
	 * 
	 * @param null
	 * @return 对象或者null;
	 */
	public Class<T> getPersistentObject();

	/**
	 * 得到对象
	 * 
	 * @param id
	 *            对象id
	 * @return 对象或者null;
	 */
	public Object getObject(Serializable id);

	public T get(Class<T> refClass, Serializable key);

	/**
	 * 保存对象
	 * 
	 * @param obj
	 *            被保存的对象
	 */
	public void save(Object obj);

	/**
	 * 更新对象
	 * 
	 * @param obj
	 *            被保存的对象
	 */
	public void update(Object obj);

	/**
	 * 删除对象
	 * 
	 * @param obj
	 *            被删除的对象
	 */
	public void deleteObject(Object obj);

	/**
	 * 删除对象
	 * 
	 * @param id
	 *            被删除的对象
	 */
	public void deletebyId(Serializable id);

	/**
	 * 根据 sql 分页参数查询
	 * 
	 * @param obj
	 *            List
	 */
	public List<?> findBySql(String sql, int begin, int count);

	/**
	 * 根据 sql 查询
	 * 
	 * @param obj
	 *            List
	 */
	public List<?> findBySql(String sql);

	/**
	 * 根据 hql 查询
	 * 
	 * @param obj
	 *            List
	 */
	public List<?> findByHql(String hql);

	/**
	 * 根据 sql 分页参数查询
	 * 
	 * @param obj
	 *            List
	 */
	public List<?> findByHql(String hql, int begin, int count);

	public int findCountByHql(String hql);

	public int findCountBySql(final String sql);

	/**
	 * 根据原始查询sql组建行数查询sql
	 * 
	 * @param sql
	 * @return
	 */
	public String buildCountSql(String sql);

	/**
	 * 带动态参数hql查询记录数
	 * 
	 * @param hql
	 * @param params
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public List<?> findByHql(String hql, Map<String, Object> params,
			int startIndex, int pageSize);

	/**
	 * 带动态参数hql查询记录数
	 * 
	 * @param hql
	 * @param params
	 * @return
	 */
	public int findCountByHql(String hql, Map<String, Object> params);

	/**
	 * 带动态参数sql分页查询
	 * 
	 * @param sql
	 * @param params
	 * @param startIndex
	 * @param pageSize
	 * @return
	 */
	public List<?> findBySql(String sql, Map<String, Object> params,
			int startIndex, int pageSize);

	/**
	 * 带动态参数sql查询记录数
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public int findCountBySql(String sql, Map<String, Object> params);

	/**
	 * 基于Criteria查询
	 * 
	 * @param criteria
	 * @return
	 */
	public List<T> findByCriteria(DetachedCriteria criteria);

	public int findCountByCriteria(final DetachedCriteria criteria);

	public List<T> findByCriteria(final DetachedCriteria detachedCriteria,
			final int startIndex, final int pageSize);
}
